I tried using list mode instead and it worked! I have no idea why icon mode doesn't. I don't even need to set DragDropMode to InternalMove in list mode for reordering, as I have set my DefaultDropAction to MoveAction.
What I've done instead is to change viewOptions to icon mode settings.
class SlotView(QListView):
def __init__(self, parent=None):
super().__init__(parent)
self.setMovement(QListView.Movement.Snap)
self.setDefaultDropAction(Qt.DropAction.MoveAction)
self.setSelectionMode(QListView.SelectionMode.ExtendedSelection)
self.setVerticalScrollMode(QListView.ScrollMode.ScrollPerPixel)
self.horizontalScrollBar().setEnabled(False)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
self.setIconSize(ICON_SIZE)
self.setGridSize(ICON_SIZE)
self.setFixedSize(SLOT_SIZE)
def viewOptions(self):
option = super().viewOptions()
option.showDecorationSelected = True
option.decorationPosition = QStyleOptionViewItem.Position.Top
option.displayAlignment = Qt.AlignmentFlag.AlignCenter
return option